import performance from "./performance/index";
import error from "./error/index";
import behavior from "./behavior/index";
import { setConfig } from "./config";
import { lazyReportBatch } from "./report";

window.__webEyeSDK__ = {
  version: "0.0.1",
};

/**
 * 安装Vue错误捕获插件
 *
 * 功能：注册全局Vue错误处理器，用于捕获并上报Vue组件渲染和事件处理期间的错误
 *
 * @param {Object} Vue - Vue构造函数实例，用于配置错误处理器
 * @param {Object} options - 配置选项对象，用于初始化SDK设置
 * @returns {void} 无返回值
 */
// 针对vue项目的错误捕获
function install(Vue, options) {
  // SDK重复注册检查（保证单例）
  if (__webEyeSDK__.vue) return; // 防止重复注册
  __webEyeSDK__.vue = true;

  // 初始化SDK配置
  setConfig(options);

  // 保存原始错误处理器以便链式调用
  const handler = Vue.config.errorHandler;

  // 重写Vue全局错误处理器
  Vue.config.errorHandler = function (err, vm, info) {
    // 构造错误上报数据结构
    const reportData = {
      type: "error",
      subType: "vue", // 标识错误来源为Vue框架
      error: err.stack, // 完整的错误堆栈信息
      info, // Vue提供的错误上下文信息（如生命周期钩子名称）
      pageUrl: window.location.href,
      // paths: [vm],       // 保留的组件追踪路径字段
      startTime: window.performance.now(), // 用于性能追踪的时间戳
    };

    // 批量延迟上报错误信息
    lazyReportBatch(reportData);

    // 调用原始错误处理器保持框架原有行为
    if (handler) {
      handler(err, vm, info);
    }
  };
}

// 针对React 项目的错误捕获
function errorBoundary() {
  if (__webEyeSDK__.react) return;
  __webEyeSDK__.react = true;

  // todo 上报错误信息
}

function init(options) {
  setConfig(options);
  performance();
  error();
  behavior();
}

export default {
  install,
  init,
  errorBoundary,
  performance,
  error,
  behavior,
};
